package com.example.vault.config;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
 * 动态数据源路由器
 * 根据当前线程上下文决定使用主库还是从库
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

    /**
     * 数据源类型枚举
     */
    public enum DataSourceType {
        MASTER("master"),
        SLAVE("slave");

        private final String value;

        DataSourceType(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }
    }

    /**
     * 线程本地变量，存储当前线程的数据源类型
     */
    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();

    /**
     * 设置数据源类型
     */
    public static void setDataSourceType(DataSourceType dataSourceType) {
        CONTEXT_HOLDER.set(dataSourceType.getValue());
    }

    /**
     * 获取数据源类型
     */
    public static String getDataSourceType() {
        return CONTEXT_HOLDER.get();
    }

    /**
     * 清除数据源类型
     */
    public static void clearDataSourceType() {
        CONTEXT_HOLDER.remove();
    }

    /**
     * 确定当前查找键
     * 返回数据源标识，用于路由到正确的数据源
     */
    @Override
    protected Object determineCurrentLookupKey() {
        String dataSourceType = getDataSourceType();
        // 如果没有设置，默认使用主库
        return dataSourceType != null ? dataSourceType : DataSourceType.MASTER.getValue();
    }

    /**
     * 在方法执行后清理线程本地变量
     */
    public static void reset() {
        clearDataSourceType();
    }
}